// 引入模块
import Vue from 'vue'
import VueRouter from 'vue-router'

// 2.注册路由模块
Vue.use(VueRouter)

// 统一解决编程式导航报错的问题
// 修改原型上的push方法
const originPush = VueRouter.prototype.push
const originReplace = VueRouter.prototype.replace

// 修改VueRouter原型上的push方法，解决重复跳转是报错的问题
VueRouter.prototype.push = function (localtion, okCallback, errCallback) {
  if (okCallback && errCallback) {
    // 如果上述条件成立，表示传递了这两个参数
    originPush.call(this, localtion, okCallback, errCallback) //以你传入的回调为主
  } else {
    originPush.call(this, localtion).catch(() => {}) //统一处理报错的问题
  }
}

// 修改VueRouter原型上的replace方法，解决重复跳转是报错的问题
VueRouter.prototype.replace = function (localtion, okCallback, errCallback) {
  if (okCallback && errCallback) {
    originReplace.call(this, localtion, okCallback, errCallback)
  } else {
    originReplace.call(this, localtion).catch(() => {})
  }
}

// 3.引入组件模块
import routes from './routes'
// 引入store对象
import store from '@/store'

// 4.创建路由对象
const router = new VueRouter({
  // 路由模式
  mode: 'history',
  // 书写路由规则
  routes,
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  },
})
// 准备路由白名单
const whiteList = [
  'home',
  'login',
  'register',
  'search',
  'detail',
  'addcartsuccess',
  'shopcart',
]
router.beforeEach((to, from, next) => {
  if (whiteList.includes(to.name) || store.state.user.userInfo.token) {
    next()
    return
  }
  next({
    name: 'login',
    query: {
      redirect: to.path,
    },
  })
})
export default router
